#include <stdio.h>
#include <limits.h>
#include <float.h>
#include <stdlib.h>

int main() {

    //原码：第一个bit位专门来保存符号，0表示为正数、1表示为负数，其余位用来表示数据的值
    //反码：正数的反码是其本身，负数的反码是在其原码的基础上符号位不变，其余各个位取反
    //补码：正数的补码就是其本身 （不变！），负数的补码是在其原码的基础上符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

    //一般占用8个bit位表示一个字节（B）
    //8 bit = 1 B ，1024 B = 1KB，1024 KB = 1 MB，1024 MB = 1GB，1024 GB = 1TB，1024TB = 1PB
    printf("数据类型：char，存储大小：%llu字节、最小值：%hhd，最大值：%hhd\n",
           sizeof(char), CHAR_MIN, CHAR_MAX);
    printf("数据类型：unsigned char，存储大小：%llu字节、最小值：%hhu，最大值：%hhu\n",
           sizeof(unsigned char), 0U, UCHAR_MAX);
    printf("数据类型：short，存储大小：%llu字节、最小值：%hd，最大值：%hd\n",
           sizeof(short), SHRT_MIN, SHRT_MAX);
    printf("数据类型：unsigned short，存储大小：%llu字节、最小值：%hu，最大值：%hu\n",
           sizeof(unsigned short), 0U, USHRT_MAX);
    printf("数据类型：int，存储大小：%llu字节、最小值：%d，最大值：%d\n",
           sizeof(int), INT_MIN, INT_MAX);
    printf("数据类型：unsigned int，存储大小：%llu字节、最小值：%u，最大值：%u\n",
           sizeof(unsigned int), 0U, UINT_MAX);
    //long类型所占字节在不同位数的机器上所占的字节不同，并且long占据的字节数还和编译器的数据模型相关
    printf("数据类型：long，存储大小：%llu字节、最小值：%ld，最大值：%ld\n",
           sizeof(long), LONG_MIN, LONG_MAX);
    printf("数据类型：unsigned long，存储大小：%llu字节、最小值：%lu，最大值：%lu\n",
           sizeof(unsigned long), 0LU, ULONG_MAX);
    printf("数据类型：float，存储大小：%llu字节、最小值：%g，最大值：%g\n",
           sizeof(float), FLT_MIN, FLT_MAX);
    printf("数据类型：double，存储大小：%llu字节、最小值：%lg，最大值：%lg\n",
           sizeof(double), DBL_MIN, DBL_MAX);
    printf("数据类型：long long，存储大小：%llu字节、最小值：%lld，最大值：%lld\n",
           sizeof(long long), LLONG_MIN, LLONG_MAX);
    printf("数据类型：unsigned long long，存储大小：%llu字节、最小值：%llu，最大值：%llu\n",
           sizeof(unsigned long long), 0LLU, ULLONG_MAX);
    printf("数据类型：long double，存储大小：%llu字节、最小值：%Lg，最大值：%Lg\n",
           sizeof(long double), LDBL_MIN, LDBL_MAX);

    return EXIT_SUCCESS;
}
